package com.ruoyi.common.utils;

import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.util.LinkedHashMap;
import java.util.Map;
import org.yaml.snakeyaml.DumperOptions;
import org.yaml.snakeyaml.Yaml;
import com.ruoyi.common.utils.StringUtils;

/**
 * 配置处理工具类
 * 
 * @author yml
 */
public class YamlUtil{
	public static Map<?, ?> loadYaml(String fileName) throws FileNotFoundException{
		InputStream in = YamlUtil.class.getClassLoader().getResourceAsStream(fileName);
		return StringUtils.isNotEmpty(fileName) ? (LinkedHashMap<?, ?>)new Yaml().load(in) : null;
	}

	public static void dumpYaml(String fileName, Map<?, ?> map) throws IOException{
		if(StringUtils.isNotEmpty(fileName)){
			FileWriter fileWriter = new FileWriter(YamlUtil.class.getResource(fileName).getFile());
			DumperOptions options = new DumperOptions();
			options.setDefaultFlowStyle(DumperOptions.FlowStyle.BLOCK);
			Yaml yaml = new Yaml(options);
			yaml.dump(map, fileWriter);
		}
	}

	public static Object getProperty(Map<?, ?> map, Object qualifiedKey){
		if(map != null && !map.isEmpty() && qualifiedKey != null){
			String input = String.valueOf(qualifiedKey);
			if(!"".equals(input)){
				if(input.contains(".")){
					int index = input.indexOf(".");
					String left = input.substring(0, index);
					String right = input.substring(index + 1, input.length());
					return getProperty((Map<?, ?>)map.get(left), right);
				}else if(map.containsKey(input)){
					return map.get(input);
				}else{
					return null;
				}
			}
		}
		return null;
	}

	@SuppressWarnings("unchecked")
	public static void setProperty(Map<?, ?> map, Object qualifiedKey, Object value){
		if(map != null && !map.isEmpty() && qualifiedKey != null){
			String input = String.valueOf(qualifiedKey);
			if(!input.equals("")){
				if(input.contains(".")){
					int index = input.indexOf(".");
					String left = input.substring(0, index);
					String right = input.substring(index + 1, input.length());
					setProperty((Map<?, ?>)map.get(left), right, value);
				}else{
					((Map<Object, Object>)map).put(qualifiedKey, value);
				}
			}
		}
	}
}
